/*
* Copyright (c) 2015 Guillaume Hillairet.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Guillaume Hillairet - initial API and implementation
*
*/
package org.emfjson.jackson.tests.uuids;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ArrayNode;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.emfjson.jackson.junit.model.ConcreteTypeOne;
import org.emfjson.jackson.junit.model.Container;
import org.emfjson.jackson.junit.model.ModelFactory;
import org.emfjson.jackson.junit.model.ModelPackage;
import org.emfjson.jackson.module.EMFModule;
import org.junit.Before;
import org.junit.Test;
import java.io.IOException;
import static org.junit.Assert.*;
public class UuidSaveTest extends UuidSupport {
private final ObjectMapper mapper = new ObjectMapper();
@Before
public void setUp() {
EPackage.Registry.INSTANCE.put(ModelPackage.eNS_URI, ModelPackage.eINSTANCE);
EMFModule module = new EMFModule();
module.configure(EMFModule.Feature.OPTION_USE_ID, true);
mapper.registerModule(module);
}
@Test
public void testSerializeOneObjectWithUuid() {
Resource resource = createUuidResource("test.xmi", mapper);
Container root = ModelFactory.eINSTANCE.createContainer();
resource.getContents().add(root);
// Make sure the fragment identifier is a UUID
assertTrue(EcoreUtil.getURI(root).fragment().startsWith("_"));
JsonNode node = mapper.valueToTree(root);
assertNotNull(node);
assertNotNull(node.get("@id"));
assertEquals(uuid(root), uuid(node));
}
@Test
public void testSerializeOneRootWithTwoChildHavingOneReference() throws IOException {
Resource resource = createUuidResource("test.xmi", mapper);
Container root = ModelFactory.eINSTANCE.createContainer();
ConcreteTypeOne one = ModelFactory.eINSTANCE.createConcreteTypeOne();
ConcreteTypeOne two = ModelFactory.eINSTANCE.createConcreteTypeOne();
one.setName("one");
two.setName("two");
one.getRefProperty().add(two);
root.getElements().add(one);
root.getElements().add(two);
resource.getContents().add(root);
JsonNode node = mapper.valueToTree(root);
assertNotNull(node);
assertNotNull(node.get("@id"));
assertEquals(uuid(root), uuid(node));
assertTrue(node.get("elements").isArray());
ArrayNode elements = (ArrayNode) node.get("elements");
assertEquals(2, elements.size());
JsonNode node1 = elements.get(0);
JsonNode node2 = elements.get(1);
assertNotNull(node1.get("@id"));
assertEquals(uuid(one), uuid(node1));
assertNotNull(node2.get("@id"));
assertEquals(uuid(two), uuid(node2));
assertNotNull(node1.get("refProperty"));
assertNull(node2.get("refProperty"));
assertTrue(node1.get("refProperty").isArray());
ArrayNode refProperty = (ArrayNode) node1.get("refProperty");
assertEquals(1, refProperty.size());
JsonNode ref = refProperty.get(0);
assertNotNull(ref.get("$ref"));
assertEquals(uuid(two), ref.get("$ref").asText());
}
}